package cn.cj.erp.common.excel.util;

import cn.cj.erp.common.excel.excel.*;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.*;

/**
 * Excel工具类，供外部调用
 * @author chenjian
 */
@Slf4j
public class ExcelUtil {

    /**
     * 导入数据，将excel转成list返回
     *
     * @param is 输入流
     * @return list
     */
    public static  <T> List<T> importExcel(Class<T> clazz, InputStream is) throws Exception {
        return importExcel(clazz, is, 0);
    }

    /**
     * 导入数据，将excel转成list返回
     *
     * @param is 输入流
     * @param titleNum 标题占用行数
     * @return list
     */
    public static <T> List<T> importExcel(Class<T> clazz, InputStream is, int titleNum) throws Exception {
        return ExcelImportHandler.handle(clazz, StrUtil.EMPTY, is, titleNum);
    }

    /**
     * 导出数据
     *
     * @param clazz 导出entity类型
     * @param list 导出数据列表
     * @param filename  文件全路径名称
     * @param sheetName sheet名称
     */
    public static <T> void exportExcel(Class<T> clazz,
                                       List<T> list,
                                       String filename,
                                       String sheetName) {
        exportExcel(clazz, list, filename, sheetName, StrUtil.EMPTY);
    }

    /**
     * 导出数据
     *
     * @param clazz 导出entity类型
     * @param list 导出数据列表
     * @param filename  文件全路径名称
     * @param sheetName sheet名称
     * @param title 表格标题
     */
    public static <T> void exportExcel(Class<T> clazz,
                                       List<T> list,
                                       String filename,
                                       String sheetName,
                                       String title) {
        ExcelExportHandler.handle(clazz, list, filename, sheetName, title);
    }

    /**
     * 导出数据
     *
     * @param clazz 导出entity类型
     * @param list 导出数据列表
     * @param response Servlet响应
     * @param sheetName sheet名称
     */
    public static <T> void exportExcel(Class<T> clazz,
                                       List<T> list,
                                       HttpServletResponse response,
                                       String sheetName) {
        exportExcel(clazz, list, response, sheetName, StrUtil.EMPTY);
    }

    /**
     * 导出数据
     *
     * @param clazz 导出entity类型
     * @param list 导出数据列表
     * @param response Servlet响应
     * @param sheetName sheet名称
     * @param title 表格标题
     */
    public static <T> void exportExcel(Class<T> clazz,
                                       List<T> list,
                                       HttpServletResponse response,
                                       String sheetName,
                                       String title) {
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        ExcelExportHandler.handle(clazz, list, response, sheetName, title);
    }

    /**
     * excel模版生成
     *
     * @param clazz 对应entity类型
     * @param filename 文件全路径名称
     * @param sheetName 工作表的名称
     */
    public static <T> void template(Class<T> clazz, String filename, String sheetName) {
        template(clazz, filename, sheetName, StrUtil.EMPTY);
    }

    /**
     * excel模版生成
     *
     * @param clazz 对应entity类型
     * @param filename 文件全路径名称
     * @param sheetName 工作表的名称
     * @param title 标题
     */
    public static <T> void template(Class<T> clazz,
                                    String filename,
                                    String sheetName,
                                    String title) {
        ExcelExportHandler.handle(clazz, null, filename, sheetName, title);
    }

    /**
     * excel模版生成
     *
     * @param clazz 导出entity类型
     * @param response Servlet响应
     * @param sheetName 工作表的名称
     */
    public static <T> void template(Class<T> clazz, HttpServletResponse response, String sheetName) {
        template(clazz, response, sheetName, StrUtil.EMPTY);
    }

    /**
     * excel模版生成
     *
     * @param clazz 导出entity类型
     * @param response Servlet响应
     * @param sheetName 工作表的名称
     * @param title 标题
     */
    public static <T> void template(Class<T> clazz, HttpServletResponse response, String sheetName, String title) {
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        ExcelExportHandler.handle(clazz, null, response, sheetName, title);
    }
}
